package com.evil.account.api;

import cn.hutool.core.collection.CollectionUtil;
import com.evil.account.config.FeignErrorDecoder;
import com.evil.common.account.dto.FindByNameAndEIdReqDTO;
import com.evil.common.account.dto.FindByNamesAndEIdReqDTO;
import com.evil.common.account.dto.user.*;
import com.evil.common.core.constant.ServiceNameConstant;
import com.evil.common.core.dto.FindByIdsReqDTO;
import com.evil.common.core.entity.QueryModel;
import com.github.pagehelper.PageInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户接口
 *
 * @author liyang
 * @date 2022-08-08 00:00
 */
@FeignClient(name = ServiceNameConstant.ACCOUNT_SERVICE, configuration = {FeignErrorDecoder.class})
public interface RemoteUserService {

    /**
     * 通过用户id查询用户基础信息
     *
     * @param userId userId
     * @return user
     */
    @PostMapping("/remote/find/user/by-base-id")
    UserBaseRespDTO findBaseById(@RequestParam("id") Long userId);

    /**
     * 通过用户id查询用户基础信息
     *
     * @param userId userId
     * @return user
     */
    @PostMapping("/remote/find/user/by-normal-base-id")
    UserBaseRespDTO findNormalBaseById(@RequestParam("id") Long userId);

    /**
     * 通过用户name查询用户基础信息
     *
     * @param findByNameAndEIdReqDTO findByNameAndEIdReqDTO
     * @return user
     */
    @PostMapping("/remote/find/user/by-base-name")
    UserBaseRespDTO findBaseByName(@Validated @RequestBody FindByNameAndEIdReqDTO findByNameAndEIdReqDTO);

    /**
     * 通过用户ids查询用户基础信息
     *
     * @param findByIdsReqDTO findByIdsReqDTO
     * @return user
     */
    @PostMapping("/remote/find/user/by-base-ids")
    List<UserBaseRespDTO> findBaseByIds(@Validated @RequestBody FindByIdsReqDTO findByIdsReqDTO);

    /**
     * 通过用户ids查询用户基础信息
     *
     * @param findByIdsReqDTO findByIdsReqDTO
     * @return user
     */
    default Map<Long, UserBaseRespDTO> findBaseMapByIds_Default(FindByIdsReqDTO findByIdsReqDTO) {
        if (CollectionUtil.isEmpty(findByIdsReqDTO.getIds())) {
            return new HashMap<>();
        }
        return this.findBaseMapByIds(findByIdsReqDTO);
    }

    /**
     * 通过用户name查询用户基础信息
     *
     * @param findByNamesAndEIdReqDTO findByNamesAndEIdReqDTO
     * @return user
     */
    @PostMapping("/remote/find/user/by-base-names")
    List<UserBaseRespDTO> findBaseByNames(@Validated @RequestBody FindByNamesAndEIdReqDTO findByNamesAndEIdReqDTO);

    /**
     * 通过用户name查询用户基础信息
     *
     * @param findByNamesAndEIdReqDTO findByNamesAndEIdReqDTO
     * @return user
     */
    @PostMapping("/remote/find/user/by-base-map-names")
    Map<String, UserBaseRespDTO> findBaseMapByNames(@Validated @RequestBody FindByNamesAndEIdReqDTO findByNamesAndEIdReqDTO);

    /**
     * 通过用户ids查询用户基础信息
     *
     * @param findByIdsReqDTO findByIdsReqDTO
     * @return user
     */
    @PostMapping("/remote/find/user/by-base-map-ids")
    Map<Long, UserBaseRespDTO> findBaseMapByIds(@Validated @RequestBody FindByIdsReqDTO findByIdsReqDTO);

    /**
     * 修改登录用户基础信息
     *
     * @param userBaseReqDTO userBaseReqDTO
     */
    @PostMapping("/remote/user/base-info/modify")
    void modifyBaseInfo(@Validated @RequestBody UserBaseReqDTO userBaseReqDTO);

    /**
     * 新增用户
     *
     * @param addUserReqDTO addUserReqDTO
     */
    @PostMapping("/remote/user/add")
    void add(@Validated @RequestBody AddUserReqDTO addUserReqDTO);

    /**
     * 用户编辑
     *
     * @param modifyUserReqDTO modifyUserReqDTO
     */
    @PostMapping("/remote/user/modify")
    void modify(@Validated @RequestBody ModifyUserReqDTO modifyUserReqDTO);

    /**
     * 修改个人信息
     *
     * @param modifyUserReqDTO modifyUserReqDTO
     */
    @PostMapping("/remote/user/personal/center/modify")
    void personalCenterModify(@Validated @RequestBody ModifyUserReqDTO modifyUserReqDTO);

    /**
     * 获取用户列表
     *
     * @param queryModel queryModel
     * @return PageInfo
     */
    @PostMapping("/remote/user/department/page")
    PageInfo<UserPageRespDTO> page(@Validated @RequestBody QueryModel<UserPageReqDTO> queryModel);

    /**
     * 获取用户基础信息分页列表
     *
     * @param queryModel queryModel
     * @return PageInfo
     */
    @PostMapping("/remote/user/department/base-page")
    PageInfo<UserBaseRespDTO> basePage(@Validated @RequestBody QueryModel<UserPageReqDTO> queryModel);

    /**
     * 个人中心
     *
     * @param userDetailReqDTO userDetailReqDTO
     * @return UserDetailRespDTO
     */
    @PostMapping("/remote/user/detail")
    UserDetailRespDTO userDetail(@Validated @RequestBody UserDetailReqDTO userDetailReqDTO);

    /**
     * 修改头像地址
     *
     * @param modifyPortraitReqDTO modifyUserPortraitReqDTO
     */
    @PostMapping("/remote/modify/user/portrait")
    void modifyUserPortrait(@Validated @RequestBody ModifyPortraitReqDTO modifyPortraitReqDTO);

    /**
     * 修改用户密码
     *
     * @param modifyPasswordReqDTO updatePasswordReqDTO
     */
    @PostMapping("/remote/user/password/modify")
    void modifyPassword(@Validated @RequestBody ModifyPasswordReqDTO modifyPasswordReqDTO);

    /**
     * 重置用户密码
     *
     * @param resetPasswordReqDTO resetPasswordReqDTO
     */
    @PostMapping("/remote/reset/password")
    String resetPassword(@Validated @RequestBody ResetPasswordReqDTO resetPasswordReqDTO);

    /**
     * 获取用户数量
     *
     * @param userCountReqDTO enterpriseId
     * @return userAmountRespDTO
     */
    @GetMapping("/remote/user/count")
    UserCountRespDTO userCount(@Validated @RequestBody UserCountReqDTO userCountReqDTO);
}
